package com.lh.struts.filter;



import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import com.lh.java.basic.date.StringUtils;
import com.lh.jsp.urlparamEncoding.CharacterEncodingConstants;
import com.lh.log.log4j.LoggerImpl;
import com.lh.log.log4j.interfaces.Log;




/**
 ************************************************ 
 ** Module :请求字符的封装编码类 Date: 2011-12-27 Time: 下午12:14:31 Author 李恒(liheng) (C)
 * Copyright 2011 广州赢典信息科技有限公司
 ************************************************ 
 */
public class CharacterEncodingHttpServletRequestWrapper extends
		HttpServletRequestWrapper {
	private static  Log logger = new LoggerImpl(CharacterEncodingHttpServletRequestWrapper.class);
	private String ecoding = null;
	private String oldEncoding = null;

	public CharacterEncodingHttpServletRequestWrapper(
			HttpServletRequest request, String encoding) {
		super(request);
		this.ecoding = encoding;
		this.oldEncoding = request.getCharacterEncoding();
	}
//    1.getParameter(name)，返回单个值。
//    2.getParameterValues(name)，返回一个数组。
//    3.getParameterMap()，把客户端提交参数封装为一个Map返回。K：name，V：value。
//
//  当我们使用servlet的时候一般都是使用前两种，struts1使用的第2种，struts2(xwork)则使用的第3种
	public String getParameter(String value) {
		try {
			if ((oldEncoding == null || isIOS88591(oldEncoding))
					&& super.getParameter(value) != null) {
				return new String(super.getParameter(value).trim().getBytes(
						CharacterEncodingConstants.IOS8859), ecoding);
			} else {
				return super.getParameter(value).trim();
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.debug("CharacterEncodingHttpServletRequestWrapper转码异常。");
			return null;
		}
	}
	public String[] getParameterValues(String name){
		String[] sourceArray=super.getParameterValues(name);
		String[] targetArray=null;
		if(null!=sourceArray&&sourceArray.length>0){
			targetArray=new String[sourceArray.length];
			for(int i=0;i<sourceArray.length;i++){
				String str=this.getParameter(sourceArray[i]);
				if(StringUtils.isEmpty(str)){
					targetArray[i]="";
				}else{
					targetArray[i]=str;
				}
			}
		}
		return targetArray;
	}
	public Map getParameterMap(String name){
		return null;
	}

	private boolean isIOS88591(String endcoding) {
		endcoding = endcoding.toLowerCase();
		return endcoding.startsWith("iso") && (endcoding.indexOf("8859") != -1)
				&& endcoding.endsWith("1");
	}

}
